﻿package com.zouloux.ui 
{
	import com.greensock.easing.Strong;
	import com.greensock.TweenMax;
	
	
	/**
	 * ...
	 * @author ZoulouX
	 */
	dynamic public class TweenConfig 
	{
		// Le constructeur
		public function TweenConfig (pEase:Function = null, pDuration:Number = .7, pAdditionalParameters:Object = null)
		{
			// Enregistrer les valeurs
			this["ease"] = pEase == null ? Strong.easeInOut : pEase;
			this["duration"] = pDuration;
			
			// Ajouter les autres propriétés
			if (pAdditionalParameters != null)
			{
				for (var i:String in pAdditionalParameters)
				{
					this[i] = pAdditionalParameters[i];
				}
			}
		}
		
		// Récupérer une propriété
		public function get (pName:String):*
		{
			return this[pName];
		}
		
		// Ajouter une propriété
		public function set (pName:String, pValue:*):void
		{
			// Ajouter et écraser
			this[pName] = pValue;
		}
		
		// Ajouter une propriété sans l'écraser
		public function softSet (pName:String, pValue:*):void
		{
			// Vérifier si elle existe pas déjà
			if (this[pName] == null)
				this[pName] = pValue;
		}
		
		// Ajouter tout un objet
		public function add (pObject:Object):void
		{
			for (var i:String in pObject) 
			{
				set(i, pObject[i]);
			}
		}
		
		// Ajouter tout un objet sans l'écraser
		public function softAdd (pObject:Object):void
		{
			for (var i:String in pObject) 
			{
				softSet(i, pObject[i]);
			}
		}
		
		// Récupérer la durée
		public function getDuration ():Number
		{
			return get("duration");
		}
		
		// Récupérer toutes les props, sauf la durée
		public function getProps ():Object
		{
			// Créer l'objet de retour
			var pReturn:Object = { };
			
			// Parser l'objet courant
			for (var i:String in this)
			{
				// Si c'est pas duration, on ajoute
				if (i != "duration")
					pReturn[i] = this[i];
			}
			
			// Retourner l'objet de retour
			return pReturn;
		}
		
		// Démarrer la tween vers
		public function to (pObject:Object, pAdditionalParameters:Object = null):TweenMax
		{
			// On ajoute les paramètres optionnels
			if (pAdditionalParameters != null)
				this.add(pAdditionalParameters);
			
			// On tween
			return TweenMax.to(pObject, getDuration(), getProps());
		}
		
		// Démarrer la tween depuis
		public function from (pObject:Object, pAdditionalParameters:Object = null, pToParameters:Object = null):TweenMax
		{
			// On ajoute les paramètres optionnels
			if (pAdditionalParameters != null)
				this.add(pAdditionalParameters);
			
			// Ajouter les paramètres de provenance
			if (pToParameters != null)
			{
				for (var i:String in pToParameters)
				{
					pObject[i] = pToParameters[i];
				}
			}
			
			// On tween
			return TweenMax.from(pObject, getDuration(), getProps());
		}
		
		public function clear ():void
		{
			// Parser l'objet courant
			for (var i:String in this)
			{
				// Si c'est pas duration, on ajoute
				if (i != "duration" || i != "ease")
					delete this[i];
			}
		}
	}
}